package com.yc.testThread;

import java.util.Map;
import java.util.function.Consumer;

/**
 * Created with IntelliJ IDEA.
 * description: 测试TransactionQueue（本类就相当于一个controller类）
 * author: yc
 * date: 2021/2/7 10:08
 */
public class TestTransactionQueue {

    public TestTransactionQueue() {
        c2 = new C2();
    }

    private C2 c2;//相当于注入controller的service对象

    public void test() {

        //创建分布式事务队列
        TransactionQueue transactionQueue = new TransactionQueue();
        try {
            //方法1（第一个事务）
            Consumer<Map> f1 = c2::m1;//m1方法。这一步不能省，直接把c2::m1写在参数列表里时不被识别为函数的
            Map param = transactionQueue.param();//m1方法的参数(参数map不能共用)
            param.put("Param1", "m1的参数");//把方法1需要传的参数都添加到param1中
            transactionQueue.add(f1, param, null);//把m1添加到任务中（注意要添加m1自己的方法，自己参数，不能共用！）

            //方法2（第二个事务）
            //m2方法
            Consumer<Map> f2 = c2::m2;
            Map param2 = transactionQueue.param();//m1方法的参数(参数map不能共用)
            param2.put("Param2", "m2的参数");//把方法2需要传的参数都添加到param2中
            transactionQueue.add(f2, param2, 2000);//把m1添加到任务中（这里给方法2指定超时时间为2秒）

            //方法3（第三个事务）
            Consumer<Map> f3 = c2::m3;//m3方法
            Map param3 = transactionQueue.param();//m3方法的参数(参数map不能共用)
            param3.put("Param3", "m3的参数");//把方法3需要传的参数都添加到param3中
            transactionQueue.add(f3, param3, 3000);//把m3添加到任务中（注意要添加m3自己的方法，自己参数，不能共用！）

            System.out.println("--任务-start---");
            transactionQueue.start();//启动任务
            System.out.println("------任务队列结束-----");
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("捕获到异常：" + e.getMessage());
        } finally {
            if (transactionQueue != null) {
                System.out.println("-finally--clear---");
                transactionQueue.clear();//这里要清理一下。正常运行是会自动清理的，但如果异常情况，就需要手动清理一下（或者只在catch里clear）
            }
        }

    }


    public static void main(String[] args) {
        TestTransactionQueue ttq = new TestTransactionQueue();
        ttq.test();
    }
}
